using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlTypes;
using System.Data.Sql;
using System.Diagnostics;
using System.Data.SqlClient;
using System.Data;

namespace AdatbazisProjekt
{
    public struct Termek
    {
		//struktura arra szolgal h eegyszerubben tudjuk ertelmezni es atadni az osztalyok kozt a lekert adatokat
        public string TermekNev;
        public string Kategoria;
        public string Gyarto;
        public int Ar;
        public int Garancia;
        public int Darabszam;
    }

    class DataTermekKereses : DalGen
    {
		// Az osztaly a termekekhez kapcsolodo informaciok lekerdezeseben es modositaban segit
        public DataTermekKereses(ref bool Err)
        {
            if (!base.IsConnectCreated())
            {
                Err = !base.MakeConnection();
            }
        }

        public List<Termek> GetTermekInf()
        {
			// 	Lekerdezi az osszes termekhez tartozo kivant informaciokat es visszateriti egy listaban
            OpenConnection();
            List<Termek> termek = new List<Termek>();

            Termek seged;

            string error = "";
            SqlDataReader reader = mExecuteReader("SELECT TermekNev, KategoriaNev, GyartoNev, Ar, Garancia, Darabszam FROM Termekek, Gyartok, Kategoriak, Raktar WHERE Termekek.TermekID = Raktar.TermekID AND Termekek.KategoriaID = Kategoriak.KategoriaID AND Termekek.GyartoID = Gyartok.GyartoID AND Raktar.TermekID = Termekek.TermekID", ref error, null);
            while (reader.Read())
            {
                seged.TermekNev = reader["TermekNev"].ToString();
                seged.Kategoria = reader["KategoriaNev"].ToString();
                seged.Gyarto = reader["GyartoNev"].ToString();
                seged.Ar = Convert.ToInt32(reader["Ar"].ToString());
                seged.Garancia = Convert.ToInt32(reader["Garancia"].ToString());
                seged.Darabszam = Convert.ToInt32(reader["Darabszam"].ToString());

                termek.Add(seged);
            }
            this.CloseConnection();
            return termek;
        }

        public List<Termek> GetTermekKeresInf(string nev, string kategoria, string gyarto, string ar, string garancia)
        {
			// A termekekrol megjeleno informaciok alapjan valo szures
            string cmdCoutinuing = " AND Termekek.TermekNev LIKE '" + nev + "%' AND Gyartok.GyartoNev LIKE '" + gyarto + "%' AND Kategoriak.KategoriaNev LIKE '" + kategoria + "%' AND Raktar.Ar LIKE '" + ar + "%' AND Termekek.Garancia LIKE '" + garancia + "%'";
            
            OpenConnection();
            List<Termek> termek = new List<Termek>();

            Termek seged;

            string error = "";
            SqlDataReader reader = mExecuteReader("SELECT TermekNev, KategoriaNev, GyartoNev, Ar, Garancia, Darabszam FROM Termekek, Gyartok, Kategoriak, Raktar WHERE Termekek.TermekID = Raktar.TermekID AND Termekek.KategoriaID = Kategoriak.KategoriaID AND Termekek.GyartoID = Gyartok.GyartoID AND Raktar.TermekID = Termekek.TermekID" + cmdCoutinuing, ref error, null);
            while (reader.Read())
            {
                seged.TermekNev = reader["TermekNev"].ToString();
                seged.Kategoria = reader["KategoriaNev"].ToString();
                seged.Gyarto = reader["GyartoNev"].ToString();
                seged.Ar = Convert.ToInt32(reader["Ar"].ToString());
                seged.Garancia = Convert.ToInt32(reader["Garancia"].ToString());
                seged.Darabszam = Convert.ToInt32(reader["Darabszam"].ToString());

                termek.Add(seged);
            }
            this.CloseConnection();
            return termek;
        }

        public List<String> GetKategoriak()
        {
			// lekerdezi az adatbazisban levo osszes kategoriat es visszateriti egy string listaban
            OpenConnection();
            List<String> kategoriak = new List<String>();
            kategoriak.Add("");
            string error = "";
            SqlDataReader reader = mExecuteReader("SELECT KategoriaNev FROM Kategoriak", ref error, null);
            while (reader.Read())
            {
                kategoriak.Add(reader["KategoriaNev"].ToString());
            }
            this.CloseConnection();
            return kategoriak;
        }

        public List<String> GetGyartok()
        {
			// Lekerdezi az adatbazisban eltarolt gyartok neveit es visszateriti egy listaban
            OpenConnection();
            List<String> gyartok = new List<String>();
            string error = "";
            SqlDataReader reader = mExecuteReader("SELECT GyartoNev FROM Gyartok", ref error, null);
            while (reader.Read())
            {
                gyartok.Add(reader["GyartoNev"].ToString());
            }
            this.CloseConnection();
            return gyartok;
        }

        private string TermekIDNevUtan(string nev)
        {
			// Egy adott termekhez tartozo nev alapjan visszateriti a termek ID-jat
            OpenConnection();
            string iD = "";
            string error = "";
            SqlDataReader reader = mExecuteReader("SELECT TermekID FROM Termekek WHERE TermekNev = '"+nev+"'", ref error, null);
            if (reader.Read())
            {
                iD = reader["TermekID"].ToString();
            }
            this.CloseConnection();
            return iD;
        }


        public void TermekEladas(string termekNev, string ar, string vasarloNev, 
            string szemSzam, string lakHely, string telSzam,
            string regcom,string bank,string bankszamla,string codfisc ,string nrord,ref bool error)
        {
			// Egy tarolt eljaras segitsegevel elvegzi egy adott termek eladasat
            List<String> paraNev = new List<string>();
            List<String> paraErtek = new List<string>();

            paraNev.Add("@termekAr");
            paraNev.Add("@termekNev");
            paraNev.Add("@vasarloNev");
            paraNev.Add("@vasarloSzemSzam");
            paraNev.Add("@vasarloLakhely");
            paraNev.Add("@vasarloTelSzam");
            paraNev.Add("@ar");
            paraNev.Add("@regcom");
            paraNev.Add("@bank");
            paraNev.Add("@bankszamla");
            paraNev.Add("@codfisc");
            paraNev.Add("@nrord");

            paraErtek.Add(ar);
            paraErtek.Add(termekNev);
            paraErtek.Add(vasarloNev);
            paraErtek.Add(szemSzam);
            paraErtek.Add(lakHely);
            paraErtek.Add(telSzam);
            paraErtek.Add(ar);
            paraErtek.Add(regcom);
            paraErtek.Add(bank);
            paraErtek.Add(bankszamla);
            paraErtek.Add(codfisc);
            paraErtek.Add(nrord);
            this.MyExecuteNonQueryWithParameters("EXEC Eladas @termekAr, @termekNev, @vasarloNev, @vasarloSzemSzam, @vasarloLakhely, @vasarloTelSzam, @ar,@regcom,@bank,@bankszamla,@codfisc,@nrord", paraNev, paraErtek, null);
        }

        public void TermekAdatFrissit(String regiNev,String regikategoria, String regiGyarto, String regiGarancia, String regiAr, String nev, String kategoria, String gyarto, String ar, String garancia, String darab, ref bool error)
        {
			// Egy termekre vonatkozo adatok frisiteset vegzi
            
            // OPTIMISTA TRANZAKCIO
            
            string id = TermekIDNevUtan(regiNev);

            DataTermekKereses keres = new DataTermekKereses(ref error);
            // Rakeresunk a regi adatokra ha megtalaljuk a gepet akkor modositunk...ha meg nem modositotta senki      
            if ((keres.GetTermekKeresInf(regiNev,kategoria,gyarto,regiAr,garancia)).Count > 0){
                this.MyExecuteNonQuery(" UPDATE Termekek SET TermekNev = '"+nev+"', Garancia = "+garancia+", KategoriaID =(SELECT KategoriaID FROM Kategoriak WHERE KategoriaNev = '"+kategoria+"'), GyartoID = (SELECT GyartoID FROM Gyartok WHERE GyartoNev = '"+gyarto+"')  WHERE TermekID = "+id, ref error, null);
                this.MyExecuteNonQuery("UPDATE Raktar SET Ar = "+ar+", Darabszam = "+darab+" WHERE TermekID = "+id+" AND Ar ="+regiAr, ref error, null);       
            }
   
        }

		public List<Termek> AlkatreszekSzerint(string processzorNev, string processzorTeljesitmeny, string processzorMagSzam, string processzorSzalSzam, string merevlemezNev, string merevlemezKapacitas, string videokartyaNev, string videokartyaTeljesitmeny, string ramNev, string ramMeret, string ramTipus, string kepernyoNev, string kepernyoAtmero, int index, ref bool err)
		{
			// Az adatbazi melle leadott 20 lekerdezes osszekombinalasbol szuletett a metodus
			// Az alkatreszekre ez azoknak tulajdonsaira vonatokozo parameterek megadasa utan egy szurt Termek Listat ad vissza  metodus	
			try
			{
				List<Termek> eredmeny = new List<Termek>();
				string error = "";
				Termek seged;
				string cmdProcesszorNev = "(SELECT TermekNev, KategoriaNev, GyartoNev, Ar, Garancia, Darabszam FROM Termekek, Gyartok, Kategoriak, Raktar, Processzorok, Felepites WHERE Termekek.TermekID = Raktar.TermekID AND Termekek.KategoriaID = Kategoriak.KategoriaID AND Termekek.GyartoID = Gyartok.GyartoID AND Raktar.TermekID = Termekek.TermekID AND Felepites.TermekID = Termekek.TermekID AND Felepites.AlkatreszID = Processzorok.AlkatreszID AND Processzorok.Nev LIKE '" + processzorNev + "%')";
				string cmdProcesszorTelj = "(SELECT TermekNev, KategoriaNev, GyartoNev, Ar, Garancia, Darabszam FROM Termekek, Gyartok, Kategoriak, Raktar, Processzorok, Felepites, Tulajdonsagok, AlkTulajd WHERE Termekek.TermekID = Raktar.TermekID AND Termekek.KategoriaID = Kategoriak.KategoriaID AND Termekek.GyartoID = Gyartok.GyartoID AND Raktar.TermekID = Termekek.TermekID AND Felepites.TermekID = Termekek.TermekID AND Felepites.AlkatreszID = Processzorok.AlkatreszID AND Processzorok.AlkatreszID = AlkTulajd.AlkatreszID AND AlkTulajd.TulajdonsagID = Tulajdonsagok.TulajdonsagID AND Tulajdonsagok.Nev = 'Teljesitmeny' AND Tulajdonsagok.Ertek LIKE '" + processzorTeljesitmeny + "%')";
				string cmdProcesszorMag = "(SELECT TermekNev, KategoriaNev, GyartoNev, Ar, Garancia, Darabszam FROM Termekek, Gyartok, Kategoriak, Raktar, Processzorok, Felepites, Tulajdonsagok, AlkTulajd WHERE Termekek.TermekID = Raktar.TermekID AND Termekek.KategoriaID = Kategoriak.KategoriaID AND Termekek.GyartoID = Gyartok.GyartoID AND Raktar.TermekID = Termekek.TermekID AND Felepites.TermekID = Termekek.TermekID AND Felepites.AlkatreszID = Processzorok.AlkatreszID AND Processzorok.AlkatreszID = AlkTulajd.AlkatreszID AND AlkTulajd.TulajdonsagID = Tulajdonsagok.TulajdonsagID AND Tulajdonsagok.Nev = 'MagSzam' AND Tulajdonsagok.Ertek LIKE '" + processzorMagSzam + "%')";
				string cmdProcesszorSzal = "(SELECT TermekNev, KategoriaNev, GyartoNev, Ar, Garancia, Darabszam FROM Termekek, Gyartok, Kategoriak, Raktar, Processzorok, Felepites, Tulajdonsagok, AlkTulajd WHERE Termekek.TermekID = Raktar.TermekID AND Termekek.KategoriaID = Kategoriak.KategoriaID AND Termekek.GyartoID = Gyartok.GyartoID AND Raktar.TermekID = Termekek.TermekID AND Felepites.TermekID = Termekek.TermekID AND Felepites.AlkatreszID = Processzorok.AlkatreszID AND Processzorok.AlkatreszID = AlkTulajd.AlkatreszID AND AlkTulajd.TulajdonsagID = Tulajdonsagok.TulajdonsagID AND Tulajdonsagok.Nev = 'ThreadSzam' AND Tulajdonsagok.Ertek LIKE '" + processzorSzalSzam + "%')";
				string cmdMerevlemezNev = "(SELECT TermekNev, KategoriaNev, GyartoNev, Ar, Garancia, Darabszam FROM Termekek, Gyartok, Kategoriak, Raktar, Merevlemezek, Felepites WHERE Termekek.TermekID = Raktar.TermekID AND Termekek.KategoriaID = Kategoriak.KategoriaID AND Termekek.GyartoID = Gyartok.GyartoID AND Raktar.TermekID = Termekek.TermekID AND Felepites.TermekID = Termekek.TermekID AND Felepites.AlkatreszID = Merevlemezek.AlkatreszID AND Merevlemezek.Nev LIKE '" + merevlemezNev + "%')";
				string cmdMerevlemezKapacitas = "(SELECT TermekNev, KategoriaNev, GyartoNev, Ar, Garancia, Darabszam FROM Termekek, Gyartok, Kategoriak, Raktar, Merevlemezek, Felepites, Tulajdonsagok, AlkTulajd WHERE Termekek.TermekID = Raktar.TermekID AND Termekek.KategoriaID = Kategoriak.KategoriaID AND Termekek.GyartoID = Gyartok.GyartoID AND Raktar.TermekID = Termekek.TermekID AND Felepites.TermekID = Termekek.TermekID AND Felepites.AlkatreszID = Merevlemezek.AlkatreszID AND Merevlemezek.AlkatreszID = AlkTulajd.AlkatreszID AND AlkTulajd.TulajdonsagID = Tulajdonsagok.TulajdonsagID AND Tulajdonsagok.Nev = 'Kapacitas' AND Tulajdonsagok.Ertek LIKE '" + merevlemezKapacitas + "%')";
				string cmdVideokartyaNev = "(SELECT TermekNev, KategoriaNev, GyartoNev, Ar, Garancia, Darabszam FROM Termekek, Gyartok, Kategoriak, Raktar, Videokartyak, Felepites WHERE Termekek.TermekID = Raktar.TermekID AND Termekek.KategoriaID = Kategoriak.KategoriaID AND Termekek.GyartoID = Gyartok.GyartoID AND Raktar.TermekID = Termekek.TermekID AND Felepites.TermekID = Termekek.TermekID AND Felepites.AlkatreszID = Videokartyak.AlkatreszID AND Videokartyak.Nev LIKE '" + videokartyaNev + "%')";
				string cmdVideokaryaTelj = "(SELECT TermekNev, KategoriaNev, GyartoNev, Ar, Garancia, Darabszam FROM Termekek, Gyartok, Kategoriak, Raktar, Videokartyak, Felepites, Tulajdonsagok, AlkTulajd WHERE Termekek.TermekID = Raktar.TermekID AND Termekek.KategoriaID = Kategoriak.KategoriaID AND Termekek.GyartoID = Gyartok.GyartoID AND Raktar.TermekID = Termekek.TermekID AND Felepites.TermekID = Termekek.TermekID AND Felepites.AlkatreszID = Videokartyak.AlkatreszID AND Videokartyak.AlkatreszID = AlkTulajd.AlkatreszID AND AlkTulajd.TulajdonsagID = Tulajdonsagok.TulajdonsagID AND Tulajdonsagok.Nev = 'Teljesitmeny' AND Tulajdonsagok.Ertek LIKE '" + videokartyaTeljesitmeny + "%')";
				string cmdRamNev = "(SELECT TermekNev, KategoriaNev, GyartoNev, Ar, Garancia, Darabszam FROM Termekek, Gyartok, Kategoriak, Raktar, RAM, Felepites WHERE Termekek.TermekID = Raktar.TermekID AND Termekek.KategoriaID = Kategoriak.KategoriaID AND Termekek.GyartoID = Gyartok.GyartoID AND Raktar.TermekID = Termekek.TermekID AND Felepites.TermekID = Termekek.TermekID AND Felepites.AlkatreszID = RAM.AlkatreszID AND RAM.Nev LIKE '" + ramNev + "%')";
				string cmdRamMeret = "(SELECT TermekNev, KategoriaNev, GyartoNev, Ar, Garancia, Darabszam FROM Termekek, Gyartok, Kategoriak, Raktar, RAM, Felepites, Tulajdonsagok, AlkTulajd WHERE Termekek.TermekID = Raktar.TermekID AND Termekek.KategoriaID = Kategoriak.KategoriaID AND Termekek.GyartoID = Gyartok.GyartoID AND Raktar.TermekID = Termekek.TermekID AND Felepites.TermekID = Termekek.TermekID AND Felepites.AlkatreszID = RAM.AlkatreszID AND RAM.AlkatreszID = AlkTulajd.AlkatreszID AND AlkTulajd.TulajdonsagID = Tulajdonsagok.TulajdonsagID AND Tulajdonsagok.Nev = 'Meret' AND Tulajdonsagok.Ertek LIKE '" + ramMeret + "%')";
				string cmdRamTipus = "(SELECT TermekNev, KategoriaNev, GyartoNev, Ar, Garancia, Darabszam FROM Termekek, Gyartok, Kategoriak, Raktar, RAM, Felepites, Tulajdonsagok, AlkTulajd WHERE Termekek.TermekID = Raktar.TermekID AND Termekek.KategoriaID = Kategoriak.KategoriaID AND Termekek.GyartoID = Gyartok.GyartoID AND Raktar.TermekID = Termekek.TermekID AND Felepites.TermekID = Termekek.TermekID AND Felepites.AlkatreszID = RAM.AlkatreszID AND RAM.AlkatreszID = AlkTulajd.AlkatreszID AND AlkTulajd.TulajdonsagID = Tulajdonsagok.TulajdonsagID AND Tulajdonsagok.Nev = 'Tipus' AND Tulajdonsagok.Ertek LIKE '" + ramTipus + "%')";
				string cmdKepernyoNev = "(SELECT TermekNev, KategoriaNev, GyartoNev, Ar, Garancia, Darabszam FROM Termekek, Gyartok, Kategoriak, Raktar, Kepernyok, Felepites WHERE Termekek.TermekID = Raktar.TermekID AND Termekek.KategoriaID = Kategoriak.KategoriaID AND Termekek.GyartoID = Gyartok.GyartoID AND Raktar.TermekID = Termekek.TermekID AND Felepites.TermekID = Termekek.TermekID AND Felepites.AlkatreszID = Kepernyok.AlkatreszID AND Kepernyok.Nev LIKE '" + kepernyoNev + "%')";
				string cmdKepeAtm = "(SELECT TermekNev, KategoriaNev, GyartoNev, Ar, Garancia, Darabszam FROM Termekek, Gyartok, Kategoriak, Raktar, Kepernyok, Felepites, Tulajdonsagok, AlkTulajd WHERE Termekek.TermekID = Raktar.TermekID AND Termekek.KategoriaID = Kategoriak.KategoriaID AND Termekek.GyartoID = Gyartok.GyartoID AND Raktar.TermekID = Termekek.TermekID AND Felepites.TermekID = Termekek.TermekID AND Felepites.AlkatreszID = Kepernyok.AlkatreszID AND Kepernyok.AlkatreszID = AlkTulajd.AlkatreszID AND AlkTulajd.TulajdonsagID = Tulajdonsagok.TulajdonsagID AND Tulajdonsagok.Nev = 'Atmero' AND Tulajdonsagok.Ertek LIKE '" + kepernyoAtmero + "%')";

				List<string> lekerd = new List<string>();

				lekerd.Add(cmdProcesszorNev + " INTERSECT " + cmdProcesszorTelj + " INTERSECT " + cmdProcesszorMag + " INTERSECT " + cmdProcesszorSzal);
				lekerd.Add(cmdMerevlemezNev + " INTERSECT " + cmdMerevlemezKapacitas);
				lekerd.Add(cmdVideokartyaNev + " INTERSECT " + cmdVideokaryaTelj);
				lekerd.Add(cmdRamNev + " INTERSECT " + cmdRamMeret + "INTERSECT" + cmdRamTipus);
				lekerd.Add(cmdKepernyoNev + " INTERSECT " + cmdKepeAtm);

				SqlDataReader reader = mExecuteReader(lekerd[index], ref error, null);
				while (reader.Read())
				{
					seged.TermekNev = reader["TermekNev"].ToString();
					seged.Kategoria = reader["KategoriaNev"].ToString();
					seged.Gyarto = reader["GyartoNev"].ToString();
					seged.Ar = Convert.ToInt32(reader["Ar"].ToString());
					seged.Garancia = Convert.ToInt32(reader["Garancia"].ToString());
					seged.Darabszam = Convert.ToInt32(reader["Darabszam"].ToString());

					eredmeny.Add(seged);
				}
				this.CloseConnection();

				return eredmeny;
			}
			catch (Exception)
			{
				err = true;
				this.CloseConnection();
				return null;
			}

		}

    }

 
}
